/**
 * @file SeqQueue.h
 * @author lishihao (you@domain.com)
 * @brief 队列的顺序表示; 队列也是受限的线性表, 先进先出的特性
 *        为了能够针对假溢出, 更好的保存元素, 可以使用循环队列
 * @version 0.1
 * @date 2022-03-01
 * 
 * @copyright Copyright (c) 2022
 * 
 */

#ifndef _SEQQUEUE_H_
#define _SEQQUEUE_H_

#define Status int
#define OK 1
#define ERROR 0
#define FALSE 0
#define TRUE 1

// 最大队列的长度
#define MAXSIZE 100

// 少用一个空间元素来区分队空和队满
// 队空: front == rear
// 队满: (rear+1) % MAXSIZE == front

typedef int ElemType;

typedef struct {
    // 存放元素的的数组
    ElemType *base;
    // 队头下标, 若队列不为空, 则初始指向第一个元素
    int front;
    // 队尾下标, 若队列不为空, 指向队尾元素的下一位置
    int rear;
} SeqQueue;

// 初始化
Status InitQueue(SeqQueue *queue);

// 销毁
Status DestroyQueue(SeqQueue *queue);

// 求队列的长度
int QueueLength(SeqQueue queue);

// 入队
Status EnQueue(SeqQueue queue, ElemType e);

// 出队
Status DeQueue(SeqQueue queue, ElemType *e);

// 取队头元素
ElemType GetHead(SeqQueue queue);

#endif
